package model.uczenie.dane;

import infrastruktura.PlikNotowanieRepozytorium;

import java.util.ArrayList;
import java.util.List;

import model.annotation.DomainFactory;

import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;

import system.Data;
import tools.Statystyka;
import tools.StatystykaAT;



/**
 * Fabryka Cechy
 */
@DomainFactory
public class CechaFabryka {
	
    private static final JexlEngine jexl = new JexlEngine();
    
    private static final JexlContext context = new MapContext();
    
    static {
    	jexl.setCache(512);
    	jexl.setLenient(false);
    	jexl.setSilent(false);
       
	    context.set("s", new Statystyka());
	    context.set("o", new StatystykaAT());
	    context.set("r", new PlikNotowanieRepozytorium());
    }
	
	public Cecha stworz (
			CechaDefinicja cechaDefinicja,
			double[] dane,
			String[] daneEtykiety) {
		List<CechaDana> cechaDane = new ArrayList<CechaDana>();
		for (int i = 0; i < dane.length; i++) {
			CechaDana cechaDana = new CechaDana(daneEtykiety[i], dane[i]);
			cechaDane.add(cechaDana);
		}
		Cecha cecha = new Cecha(cechaDefinicja, cechaDane);
		
		return cecha;
	}
	
	public Cecha stworz (
			CechaDefinicja cechaDefinicja,
			double[] dane) {
		String[] daneEtykiety = new String[dane.length];
		for (int i = 0; i < dane.length; i++) {
			daneEtykiety[i] = cechaDefinicja.getEtykieta() + "[" + i + "]";
		}
		Cecha cecha = stworz(cechaDefinicja, dane, daneEtykiety);
		
		return cecha;
	}

	public Cecha stworz(CechaDefinicja cechaDefinicja, String walorNazwa, List<Data> kursyDaty) {
		double[] dane = new double[kursyDaty.size()];
		String[] daneEtykiety = new String[kursyDaty.size()];

		Expression e = jexl.createExpression( cechaDefinicja.getWyrazenie());
	    int i = 0;
	    for (Data notowanieData: kursyDaty) {
	    	context.set("etykieta", notowanieData);
	    	context.set("walorNazwa", walorNazwa);
		    Double wynik = (Double)e.evaluate(context);
		    dane[i] = wynik.doubleValue();
		    daneEtykiety[i] = "dana: " + notowanieData;
	    	i++;
	    }

		Cecha cecha = stworz (cechaDefinicja, dane, daneEtykiety);
		return cecha;
	}
	
	

}
